package juc2.synchronizeddome;

public class SynchronizedInterruptDemo {
    private final Object lock = new Object();

    public void longRunningTask() {
        synchronized (lock) {
            System.out.println(Thread.currentThread().getName() + "：获取到锁，开始执行任务");

            // 模拟耗时操作，期间检测中断状态
            while (true) {
                try {
                    // 模拟业务逻辑（每次执行一小步）
                    Thread.sleep(1000);
                    System.out.println(Thread.currentThread().getName() + "：执行任务中...");

                    // 检测是否被中断
                    if (Thread.currentThread().isInterrupted()) {
                        System.out.println(Thread.currentThread().getName() + "：检测到中断，主动退出");
                        // 可选择清除中断状态（视需求而定）
                        // Thread.interrupted();
                        break; // 退出循环，释放锁
                    }
                } catch (InterruptedException e) {
                    // 若在sleep时被中断，会抛出InterruptedException并清除中断状态
                    System.out.println(Thread.currentThread().getName() + "：在sleep中被中断，退出");
                    // 重新设置中断状态（因为InterruptedException会清除状态）
                    Thread.currentThread().interrupt();
                    break; // 退出循环，释放锁
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        SynchronizedInterruptDemo demo = new SynchronizedInterruptDemo();

        // 线程1：先获取锁并执行长时间任务
        Thread thread1 = new Thread(demo::longRunningTask, "线程1");
        thread1.start();
        Thread.sleep(500); // 确保线程1先获取锁

        // 线程2：尝试获取锁（会进入BLOCKED状态，无法被中断）
        Thread thread2 = new Thread(demo::longRunningTask, "线程2");
        thread2.start();

        // 主线程：3秒后中断线程1（已获取锁，可响应），5秒后中断线程2（未获取锁，无法响应）
        Thread.sleep(3000);
        System.out.println("主线程：中断线程1");
        thread1.interrupt();

        Thread.sleep(2000);
        System.out.println("主线程：尝试中断线程2（但线程2处于BLOCKED状态，无法响应）");
        thread2.interrupt();
    }
}

